package com.example.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@Aspect //切面类
public class MyAspect {

    // 环绕通知  通知方法在目标方法前后都执行
    @Around("com.example.aop.TimeAspect.pt()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        log.info("around  before......");

//       执行目标方法 一定要将方法的返回值返回出去
        Object proceed = proceedingJoinPoint.proceed();


        log.info("around  after......");

        return proceed;

    }

    // 前置通知  通知方法在目标方法前执行
    @Before("com.example.aop.TimeAspect.pt()")
    public void before(){

        log.info("before ......");
    }

    // 环绕通知  通知方法在目标方法后执行 无论是否有异常均执行
    @After("com.example.aop.TimeAspect.pt()")
    public void after() {

        log.info("  after......");

    }


    // 返回后通知  通知方法在目标方法后执行 有异常不会执行
    @AfterReturning("com.example.aop.TimeAspect.pt()")
    public void afterReturning() {

        log.info("afterReturning......");
    }

    // 异常后通知  通知方法发生异常后执行
    @AfterThrowing("com.example.aop.TimeAspect.pt()")
    public void afterThrowing()  {
        log.info("afterThrowing......");

    }

}
